home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 21 / AMIGAplus Sonderheft 21 (1999)(ICP)(DE)[!].iso / PublicDomain / System / recoverdeldir / arexx / RecoverDelDir.dopus5 < prev    next >
Text File  |  1999-08-23  |  33KB  |  1,053 lines

  1. /* $VER: RecoverDelDir 1.1 (23.3.1999) by Ralf Heinert */
  2. /* Frodo@W-Specht.e.Ruhr.de | Frodo@Focus.Ruhr.de      */
  3. /* Designed for DirOpus 5.5 and AFS/PFS/SFS            */
  4. /* to recover deleted files found in :.Deldir          */
  5.  
  6. /* Speichern als DOpus5:ARexx/RecoverDelDir.dopus5     */
  7. /* Einbinden, z.B.im Lister-Popup-Menü, mittels        */
  8. /* --------------------------------------------------  */
  9. /* ARexx   DOpus5:ARexx/RecoverDelDir.dopus5 {Qp} {Ql} */
  10. /* Abhaken: Asynchron                                  */
  11. /* --------------------------------------------------  */
  12. /* und den neuen Menuepunkt                            */
  13. /* nahe dem Eintrag 'Loeschen' platzieren.             */
  14. /* Kopieren Sie auch das Verzeichnis 'Defaultstrings'  */
  15. /* samt Inhalt nach DOpus5:ARexx/                      */
  16.  
  17. /* Anwendung:                                          */
  18. /* Einen Quell-Lister öffnen                           */
  19. /* oder den Quell-lister benutzen, den man gerade hat. */
  20. /* Den oben erstellten Menüpunkt benutzen,             */
  21. /* und die zu restaurierende Datei                     */
  22. /* wird in das aktuelle Verzeichnis,                   */
  23. /* oder ein anderes auszuwählendes, restauriert.       */
  24.  
  25.  
  26. options results
  27. options FAILAT 99
  28.  
  29. SIGNAL ON break_c
  30. SIGNAL ON failure
  31. SIGNAL ON halt
  32. SIGNAL ON ioerr
  33. SIGNAL ON syntax
  34.  
  35. NL = '0a'x
  36. Fehler  = 0
  37. Catalog = 0
  38. ENVPrefs  = "ENV:RecoverDelDir.prefs"
  39. ReqTitle  = "Early RecoverDelDir Error"
  40. PubScreen = "Directory Opus"
  41. RDDPrefs  = "SYS:Prefs/RecoverDelDir.prefs"
  42. RDDgGuide = "DOpus5:Tools/RecoverDelDir/Anleitungen/RecoverDelDir.Guide"
  43. RDDeGuide = "DOpus5:Tools/RecoverDelDir/Instructions/RecoverDelDir.Guide"
  44.  
  45. Kennung  = "."||Right(CALL Pragma(ID),8)"."Time('S')
  46. window = '00000000'x
  47.  
  48. PrefsVersion      = "RDD.prefs 1.2"
  49. PrefsLines        = 6
  50. MaxPathNameLength = 62
  51. ProgramNameLength = 20
  52. DefaultStrings    = "DefaultStrings"
  53. DelDirFound       = 0
  54. DelDirName.1      = ".DELDIR"
  55. DelDirName.2      = ".Recycled"
  56. DelDirName.3      = ""
  57. SFSDelDirNamePath = "DOpus5:Tools/RecoverDelDir/C/"
  58. DeviceInfoPath    = "DOpus5:Tools/RecoverDelDir/C/"
  59.  
  60. PARSE ARG DOpusPort ListerHandle
  61.  
  62.  
  63. /* Programm lokalisieren */
  64.  
  65.   PARSE SOURCE . . . script
  66.  
  67.   IF Pos('/',Script) = 0 THEN DO
  68.     VARI.0 = 0
  69.     ReqText = "Please do not put RecoverDelDir\n"||,
  70.               "into a root-directory !"
  71.     Gadgets = "OK"
  72.     CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  73.     EXIT
  74.   END
  75.  
  76.   Script  = Strip(Left(Script,LastPos("/",Script) + ProgramNameLength),'B')
  77.  
  78.   IF ~EXISTS(''Script'') THEN DO
  79.     VARI.0 = 3
  80.     VARI.1 = Script
  81.     VARI.2 = LastPos('/',Script)" chars including the last '/'"
  82.     VARI.3 = MaxPathNameLength - ProgramNameLength +1
  83.     ReqText = "%s\n%s\n"||,
  84.               "Pathname too long !\n"||,
  85.               "RecoverDelDir.dopus5 cannot locate itself (see above).\n"||,
  86.               "Please ensure that the length of the pathname,\n"||,
  87.               "in which directory you put RecoverDelDir.dopus5 in,\n"||,
  88.               "doesn`t exceed %s chars."
  89.     Gadgets = "Save as Ram:E-RDD.error"
  90.     CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  91.     EXIT
  92.   END
  93.  
  94.   Progdir = Left(Script,LastPos('/',Script)-1)
  95.   OldDir  = PRAGMA('D',progdir)
  96.  
  97.   erg = loadrexx(progdir||'/'DefaultStrings,'RecoverDelDir.strings','')
  98.   IF erg = 0 THEN DO
  99.     erg = loadrexx(progdir,'RecoverDelDir.strings','')
  100.     IF erg = 0 THEN DO
  101.       VARI.0 = 2
  102.       VARI.1 = progdir
  103.       VARI.2 = Defaultstrings
  104.       ReqText = "Couldn`t find the file\n"||,
  105.                 "'RecoverDelDir.strings'\n"||,
  106.                 "in the progdir-directory\n'%s/'\n"||,
  107.                 "nor in progdir/'%s/'\n"||,
  108.                 "Please read the manual"||,
  109.                 "for correct installation !"
  110.       Gadgets = "Save as Ram:E-RDD.error"
  111.       CALL PRAGMA('D',OldDir)
  112.       CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  113.       EXIT 10
  114.     END
  115.   END
  116.  
  117. Call Open('WB','ENV:workbench','R')
  118. WbVersion = ReadLn('WB')
  119. Call Close('WB')
  120. IF Left(WbVersion,2) > 37 THEN DO
  121.   IF ~SHOW('LIBRARIES','locale.library') THEN DO
  122.     IF EXISTS('Libs:locale.library') THEN
  123.        CALL ADDLIB('locale.library',0,-30,0)
  124.   END
  125.  
  126.   IF SHOW('LIBRARIES','locale.library') THEN DO
  127.      IF Open('lg','ENV:language','R') THEN DO
  128.        language = ReadLn('lg')
  129.        Call Close('lg')
  130.      END
  131.      ELSE Language = "english"
  132.      LocalePath = progdir'catalogs/' || language || '/RecoverDelDir.catalog'
  133.      IF language ~= '' THEN
  134.         catalog = OPENCATALOG(LocalePath,'english',0)
  135.      IF catalog = 0 THEN
  136.         catalog = OPENCATALOG('RecoverDelDir.catalog','english',0)
  137.   END
  138.   ELSE Language = "english"
  139. END
  140. ELSE Language = "english"
  141. CALL PRAGMA('D',OldDir)
  142.  
  143. ReqTitle = localestring(ERROR_Title)                       /* 72 */
  144.  
  145. apptags = 'TRCA_Name     RecoverDelDir',
  146.           'TRCA_LongName RecoverDelDir.dopus5',
  147.           'TRCA_Info' '"'localestring(MSG_TRCA_Info)'"',    /* 0 */
  148.           'TRCA_Version  "1"',
  149.           'TRCA_Release  "1"',
  150.           'TRCA_Date     "23.03.1999"',
  151.           'TAG_END'
  152.  
  153. /* Ist alles Nötige vorhanden ? */
  154.  
  155. Check = Getclip('RecoverDelDir')
  156. IF Check = ''|Check = 1 THEN DO
  157.  
  158.   IF DOpusPort="" THEN DO
  159.      VARI.0  = 0
  160.      ReqText = localestring(ERROR_NoPort_1)                  /* 1 */
  161.      Gadgets = localestring(ERROR_NoPort_B0)
  162.      CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  163.      SAY localestring(ERROR_NoPort_2)
  164.      EXIT 10
  165.   END
  166.  
  167.   IF ~Show('P',DOpusPort) THEN DO
  168.      VARI.0  = 1
  169.      VARI.1  = DOpusPort
  170.      ReqText = localestring(ERROR_WrongPort_1)               /* 25 */
  171.      Gadgets = localestring(ERROR_WrongPort_B0)
  172.      IF Datatype(Dopusport,'W') & Length(DOpusport) = 9 THEN
  173.        ReqText = ReqText||localestring(ERROR_WrongPort_2)
  174.      CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  175.      EXIT 10
  176.   END
  177.  
  178.   Address value DOpusPort
  179.  
  180.   dopus version
  181.  
  182.   DVersion = translate(result,'.',' ')
  183.   IF ( DVersion='RESULT' | DVersion < 5.5 ) THEN DO
  184.      VARI.0 = 0
  185.      ReqText = localestring(ERROR_DopusVersion_1)           /* 11 */
  186.      Gadgets = localestring(ERROR_DopusVersion_B0)
  187.      CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  188.      EXIT
  189.   END
  190.  
  191.   IF ~SHOW('LIBRARIES','rexxsupport.library') THEN DO
  192.      IF ~EXISTS('Libs:rexxsupport.library') THEN DO
  193.         VARI.0 = 0
  194.         ReqText = localestring(ERROR_RexxSupportLib_1)       /* 9 */
  195.         Gadgets = localestring(ERROR_RexxSupportLib_B0)
  196.         CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  197.         EXIT 10
  198.      END
  199.      ELSE
  200.         CALL ADDLIB('rexxsupport.library',0,-30,0)
  201.   END
  202.  
  203.   IF ~SHOW('LIBRtARIES','tritonrexx.library') THEN DO
  204.      IF ~EXISTS('Libs:tritonrexx.library') THEN DO
  205.         VARI.0 = 0
  206.         ReqText = localestring(ERROR_TritonRexxLib_1)       /* 14 */
  207.         Gadgets = localestring(ERROR_TritonRexxLib_B0)
  208.         CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  209.         EXIT 10
  210.      END
  211.      ELSE
  212.         CALL ADDLIB('tritonrexx.library',10,-30,0)
  213.   END
  214.  
  215.   IF ~SHOW('LIBRARIES','triton.library') THEN DO
  216.      IF ~EXISTS('Libs:triton.library') THEN DO
  217.         VARI.0 = 0
  218.         ReqText = localestring(ERROR_TritonLib_1)           /* 16 */
  219.         Gadgets = localestring(ERROR_TritonLib_B0)
  220.         CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  221.         EXIT 10
  222.      END
  223.   END
  224. END
  225.  
  226. ReqTitle = localestring(MSG_Title)                          /* 71 */
  227. Address value DOpusPort
  228.  
  229. /* Für Programmstart von einem Knopf aus: */
  230.  
  231. IF ListerHandle = 0 THEN DO
  232.   lister query source stem source_handle.
  233.   If source_handle.count = 0 then DO
  234.     DO i = 1 TO 2
  235.       address command "wait 1 SEC"
  236.       lister query source stem source_handle.
  237.       If source_handle.count ~= 0 then LEAVE
  238.     END
  239.     If source_handle.count = 0 then DO
  240.       VARI.0 = 0
  241.       ReqText = localestring(ERROR_NoSourceLister_1)        /* 23 */
  242.       Gadgets = localestring(ERROR_NoSourceLister_B0)
  243.       CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  244.       EXIT
  245.     END
  246.   End
  247. END
  248. ELSE source_handle.0 = ListerHandle
  249.  
  250. IF Listerhandle = '' THEN DO
  251.    VARI.0 = 0
  252.    ReqText = localestring(ERROR_NoListerHandle_1)     /* 18 */
  253.    Gadgets = localestring(ERROR_NoListerHandle_B0)
  254.    ReqTitle = localestring(ERROR_Title)
  255.    CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  256.    EXIT 10
  257. END
  258.  
  259. Address value DOpusPort
  260.  
  261. RESULT = ''
  262.  
  263. lister query source_handle.0 PATH
  264. Path = RESULT
  265. IF Path = '' THEN DO
  266.    VARI.0 = 0
  267.    ReqText = localestring(ERROR_ShellStart_1)               /* 20 */
  268.    Gadgets = localestring(ERROR_ShellStart_B0)
  269.    CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  270.    say localestring(ERROR_NoPort_2)
  271.    EXIT 10
  272. END
  273.  
  274. Call _Prefs()
  275.  
  276. /* Dateisystem und Datentraegername ermitteln */
  277.  
  278. lister set source_handle.0 busy 1
  279. Device = Left(Path,Pos(":",Path))
  280. Dosbefehl = DeviceInfo" "Device" TYPE NAME >Ram:T/Test"Kennung
  281. address command Dosbefehl
  282. IF open('Info','Ram:T/Test'||Kennung,'R') THEN DO
  283.   Zeile1 = readLn('Info')
  284.   CALL CLOSE('Info')
  285.   DosBefehl = "delete Ram:T/Test"||Kennung||" QUIET"
  286.   address command DosBefehl
  287. END
  288. ELSE DO
  289.   CALL _MissedProgram(DeviceInfo)
  290.   EXIT
  291. END
  292. GType = Word(Zeile1,1)
  293. If  Length(GType)+1 = Length(Zeile1) then DO
  294.   VARI.0 = 1
  295.   VARI.1 = Device
  296.   ReqText = localestring(ERROR_No_Valid_Device_1)   /* 5 */
  297.   Gadgets = localestring(ERROR_No_AFS_PFS_SFS_B0)
  298.   CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  299.   EXIT
  300. END
  301. GName = SubStr(Zeile1,Length(GType)+2)
  302.  
  303.  
  304. /* Auf AFS/PFS/SFS pruefen */
  305.  
  306. If  Left(GType,3) ~= 'SFS' & Left(GType,3) ~= 'PFS' then DO
  307.   VARI.0 = 1
  308.   VARI.1 = Device
  309.   ReqText = localestring(ERROR_No_AFS_PFS_SFS_1)   /* 28 */
  310.   Gadgets = localestring(ERROR_No_AFS_PFS_SFS_B0)
  311.   CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  312.   EXIT
  313. END
  314.  
  315. /* SourceDelDir-Pfad festlegen */
  316.  
  317. IF Left(GType,3) = 'SFS' THEN DO
  318.   Address command SFSDelDirName' 'Device' > Ram:T/NameTest'Kennung
  319.   IF OPEN('na','Ram:T/NameTest'Kennung,'R') THEN DO
  320.     DelDirName = ReadLn('na')
  321.     CALL CLOSE('na')
  322.     Address command 'c:delete Ram:T/NameTest'Kennung' QUIET'
  323.   END
  324.   ELSE DO
  325.     CALL _MissedProgram(SFSDelDirName)
  326.     EXIT
  327.   END
  328.   IF ~Datatype(DelDirName,'W') THEN DO
  329.     SourceDelDir = Device||DelDirName
  330.     DelDirFound = 1
  331.   END
  332. END
  333.  
  334. IF ~DelDirFound THEN DO i = 1 TO 3
  335.   SourceDelDir = Device||DelDirName.i
  336.   IF Exists(SourceDelDir) THEN DO
  337.     DelDirFound = 1
  338.     DelDirName = DelDirName.i
  339.     Leave
  340.   END
  341. END
  342.  
  343. IF SourceDelDir = Device THEN DelDirFound = 0
  344. IF ~DelDirFound THEN DO
  345.     VARI.0 = 5
  346.     VARI.1 = Device
  347.     VARI.2 = Device
  348.     VARI.3 = DelDirName.1
  349.     VARI.4 = DelDirName.2
  350.     VARI.5 = DelDirName.3
  351.     ReqText = localestring(ERROR_DeldirNotFound_1) /* 40 */
  352.     Gadgets = localestring(Button_Prefs_Cancel)
  353.     CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  354.     IF Open('ReqErg',"Ram:T/RDDReqerg",'R') THEN DO
  355.       IF ReadCh('ReqErg') = 1 THEN DO
  356.         IF Exists(RddPrefs) THEN
  357.           address command 'rx 'RddPrefs' 1'
  358.         ELSE
  359.           CALL _RequestChoice(localestring(Msg_Problem_Title),"Couldn`t find\n"RddPrefs,VARI,"OK")
  360.       END
  361.       CALL Close('ReqErg')
  362.       ADDRESS COMMAND "C:Delete Ram:T/RDDReqerg QUIET"
  363.     END
  364.     EXIT
  365. END
  366. ELSE CALL _MakeDestPath(SourceDelDir)
  367.  
  368. /* Liste einlesen */
  369.  
  370.  
  371. List = showdir(SourceDelDir,'f',':')
  372. IF length(List) = 0 THEN DO
  373.   VARI.0 = 2
  374.   VARI.1 = Device
  375.   VARI.2 = SourceDelDir
  376.   ReqText = localestring(ERROR_NoDeletedFiles_1) /* 33 */
  377.   Gadgets = localestring(ERROR_NoDeletedFiles_B0)
  378.   CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  379.   EXIT
  380. END
  381.  
  382. /* Anzahl der Einträge, max.Filename-Länge ermitteln */
  383.  
  384. entries = 1
  385. MaxLen  = 0
  386. SLen    = 0
  387. SList   = List
  388.  
  389. IF GType = "SFS0" THEN DO
  390.   IF Pos(':',SList) = 0 THEN
  391.     MaxLen = Length(SList) + 1
  392.   DO WHILE Pos(':',SList) ~= 0
  393.     Trenn = LastPos(':',SList)
  394.     SLen = Length(SList)
  395.     rechts = SubStr(SList,Trenn)
  396.     SList = DELSTR(SList,Trenn)
  397.     FLen = Length(rechts)
  398.     IF FLen > MaxLen THEN DO
  399.       MaxLen = FLen
  400.       IF POS("$",rechts) > 0 THEN
  401.         MaxLen = MaxLen - 4
  402.     END
  403.     entries = entries + 1
  404.   END
  405. END
  406. ELSE DO WHILE Pos(':',SList) ~= 0
  407.     SList = DELSTR(SList,LastPos(':',SList))
  408.     entries = entries + 1
  409. END
  410.  
  411.  
  412.  
  413. /* Hauptarbeit starten */
  414.  
  415. Setclip('RecoverDelDir',2)
  416.  
  417. Call _Progress()
  418. IF i = 1 THEN DO
  419.   VARI.0 = 1
  420.   VARI.1 = SourceDelDir
  421.   ReqText = localestring(ERROR_OnlyEmptyFiles_1)  /* 49 */
  422.   Gadgets = localestring(ERROR_OnlyEmptyFiles_B0)
  423.   CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  424.   EXIT
  425. END
  426.  
  427.  
  428. /* --------------- Deldir-Fenster --------------- */
  429.  
  430. _Fenster1:
  431.  
  432. IF GType = "SFS0" THEN
  433.   Titel = localestring(WIN_UpperLine_SFS)   /* 64 */
  434. ELSE
  435.   Titel = localestring(WIN_UpperLine_PFS)   /* 65 */
  436.  
  437. ListViewtags = WindowID(1),
  438.                PubScreenName(PubScreen),
  439.                WindowPosition('TRWP_CENTERDISPLAY'),
  440.                WindowTitle('RecoverDelDir   'GName'   ('SourceDelDir')    'GType),
  441.                BeginMenu('Project'),
  442.                   MenuItem(' Guide',101),
  443.                   MenuItem(' Prefs',100),
  444.                   'HorizGroupA',
  445.                      'Space',
  446.                      'VertGroupA SpaceB',
  447.                         'HorizGroupSAC Space',
  448.                            TextH(localestring(WIN_DestinationLine)' ') 'Space',
  449.                            ClippedTextBoxMW(Desti,58,MinWidth) 'Space',
  450.                            GetDrawerButton(56) 'Space',
  451.                         'EndGroup Space',
  452.                         'Space',
  453.                         CenteredText3(Titel),
  454.                         'Space',
  455.                         ListSS('list',50,0,0) 'TRAT_MinHeight 'MinLines' TRAT_Flags TRLV_FWFONT|TRLV_SHOWSELECTED',
  456.                         'Space',
  457.                         'VertGroupA',
  458.                            'HorizGroupSAC Space',
  459.                               TextH(SourceDelDir) 'Space',
  460.                               ClippedTextBoxMW(Flist.1,57,MaxLen) 'SpaceB',
  461.                               TextH(Text2) 'Space',
  462.                               ClippedTextBoxMW(NList.1,51,Len2) 'SpaceB',
  463.                            'EndGroup Space',
  464.                         'EndGroup Space',
  465.                         'HorizGroupA Space',
  466.                            GetFileButton(55) 'Space',
  467.                            Button(localestring(WIN_Button_Doubleclick),53) 'Space',   /* 68 */
  468.                            Button(localestring(WIN_Button_RestoreFile),54) 'Space',   /* 69 */
  469.                            ButtonR(localestring(WIN_Button_QuitProgram),52) 'Space',  /* 70 */
  470.                         'EndGroup Space',
  471.                      'EndGroup',
  472.                      'Space',
  473.                   'EndGroup',
  474.                'EndProject'
  475.  
  476. /* Fensterverdrahtung */
  477.  
  478. app = TR_CREATEAPP(apptags)
  479. IF app ~= '00000000'x THEN DO
  480.   ListView = TR_OPENPROJECT(app,ListViewtags)
  481.   WindowProject = C2D(ListView)
  482.   IF ListView ~= '00000000'x THEN DO
  483.      ende = 0
  484.      nummer = 1
  485.      DO WHILE ende ~= 1
  486.         CALL TR_WAIT(app,'')
  487.         DO WHILE TR_HANDLEMSG(app,'event')
  488.            IF event.trm_class = 'TRMS_CLOSEWINDOW' THEN
  489.               ende = 1
  490.            IF event.trm_class = 'TRMS_NEWVALUE' THEN DO
  491.               SELECT
  492.                  WHEN event.trm_id = 50 THEN DO
  493.                     nummer = event.trm_data+1
  494.                     CALL TR_SETATTRIBUTE(ListView,51,'TRAT_Text',Nlist.nummer)
  495.                     CALL TR_SETATTRIBUTE(ListView,57,'TRAT_Text',Flist.nummer)
  496.                  END
  497.                  OTHERWISE
  498.                     NOP
  499.               END
  500.            END
  501.            IF event.trm_class = 'TRMS_ACTION' THEN DO
  502.             SELECT
  503.              WHEN event.trm_id = 52 THEN
  504.                 ende = 1
  505.              WHEN event.trm_id = 100 THEN
  506.                Call _PrefsStart(1)
  507.              WHEN event.trm_id = 101 THEN
  508.                Call _Guide()
  509.              WHEN event.trm_id = 53 THEN DO
  510.                 lister set source_handle.0 busy 0
  511.                 command wait "DoubleClick" SourceDelDir'/'FList.nummer
  512.                 lister set source_handle.0 busy 1
  513.              END
  514.              WHEN event.trm_id = 54 THEN DO
  515.                IF GType = "SFS0" THEN DO
  516.                  Quelldatei = FList.nummer
  517.                  Tempdatei  = FList.nummer
  518.                END
  519.                ELSE DO
  520.                  Quelldatei = FList.nummer
  521.                  Tempdatei  = NList.nummer
  522.                END
  523.                DosBefehl = "COPY FROM "||'"'SourceDelDir'/'Quelldatei'"'||" TO "||'"'TempDir||Tempdatei'"'||" CLONE DATES COM"
  524.                address command DosBefehl
  525.                command wait protect '"'TempDir||Tempdatei'" SET RWED'
  526.                CALL _FileRequest('"'Desti'"',Tempdatei,localestring(MSG_SaveAs_Req_Title),"#?",0,1,0)  /* 61 */
  527.                IF Auswahl = 1 THEN DO
  528.                  Trenn = LastPos("/",Savefile.1)
  529.                  IF Trenn = 0 THEN Trenn = Pos(":",Savefile.1)
  530.                  DDir = Left(Savefile.1,Trenn)
  531.                  IF DDir ~= Desti THEN DO
  532.                    Lister New DDir
  533.                    handler = RESULT
  534.                    Lister set handler dest
  535.                  END
  536.                  DFile = Right(Savefile.1,Length(Savefile.1)-Trenn)
  537.                  IF ~Exists(DDir||DFile) THEN
  538.                    address command copy 'FROM "'TempDir||Tempdatei'" TO "'DDir||DFile'"'
  539.                  ELSE DO
  540.                    ReqTitle = localestring(MSG_Problem_Title)        /* 60 */
  541.                    ReqText  = localestring(MSG_FileAlreadyExists_1)  /* 53 */
  542.                    Gadgets  = localestring(MSG_FileAlreadyExists_B0) /* 54 */
  543.                    VARI.0 = 1
  544.                    VARI.1 = DFile
  545.                    CALL _EasyRequest(ReqTitle,ReqText,VARI,Gadgets)
  546.                    IF Auswahl = 1 THEN
  547.                      address command copy 'FROM "'TempDir||Tempdatei'" TO "'DDir||DFile'"'
  548.                  END
  549.                  Lister Refresh Source_handle.0 full
  550.                END
  551.                DosBefehl = "delete "TempDir||Tempdatei
  552.                address command DosBefehl
  553.              END
  554.              WHEN event.trm_id = 55 THEN DO
  555.                Kennung  = "."||Right(CALL Pragma(ID),8)"."Time('S')
  556.                OutFile = "Ram:"||Translate(Sourcedeldir,'_',':')||Kennung
  557.                IF ~(EXISTS(OutFile)) THEN DO
  558.                  CALL Open(out,outfile,'W')
  559.                  DO o = 1 TO List.0
  560.                    WriteLn(out,List.o)
  561.                  END
  562.                  CALL Close(out)
  563.                  ReqTitle = localestring(MSG_ListSaved_Title) /* 59 */
  564.                  ReqText  = localestring(MSG_ListSaved_1)     /* 57 */
  565.                  Gadgets  = localestring(MSG_ListSaved_B0)    /* 58 */
  566.                  VARI.0   = 2
  567.                  VARI.1   = SourceDelDir
  568.                  VARI.2   = OutFile
  569.                  CALL _EasyRequest(ReqTitle,ReqText,VARI,Gadgets)
  570.                END
  571.              END
  572.              WHEN event.trm_id = 56 THEN DO
  573.                CALL _FileRequest('"'Desti'"',"''",localestring(MSG_NewDest_Req_Title),"#?",1,0,1)      /* 62 */
  574.                IF Auswahl = 1 THEN DO
  575.                  Desti = SaveFile.1
  576.                  IF LastPos(":",Desti) ~= Length(Desti) THEN Desti = Desti'/'
  577.                  CALL TR_SETATTRIBUTE(ListView,58,'TRAT_Text',Desti)
  578.                  Lister New Desti
  579.                  handler = RESULT
  580.                  Lister set handler dest
  581.                END
  582.              END
  583.             OTHERWISE
  584.               NOP
  585.             END
  586.            END
  587.         END
  588.      END
  589.      CALL TR_UNLOCKPROJECT(ListView)
  590.      CALL TR_CLOSEPROJECT(ListView)
  591.   END
  592.   IF app ~= '00000000'x THEN CALL TR_DELETEAPP(app)
  593. END
  594.  
  595. lister set source_handle.0 busy 0
  596. Setclip('RecoverDelDir',0)
  597.  
  598. EXIT
  599.  
  600. /* ------------------------- Progressbar -------------------------- */
  601.  
  602. _Progress:
  603.  
  604. windowtags2 =  WindowID(2),
  605.                PubScreenName(PubScreen),
  606.                WindowPosition('TRWP_CENTERDISPLAY'),
  607.                WindowFlags('TRWF_NODEPTHGADGED|TRWF_NOZIPGADGET|TRWF_NOSIZEGADGET'),
  608.                WindowTitle(localestring(MSG_Progressbar_Title)),
  609.                   'HorizGroupA',
  610.                      'Space',
  611.                      'VertGroupA',
  612.                         'Space',
  613.                           Progress(entries,0,7),
  614.                         'Space',
  615.                      'EndGroup',
  616.                      'Space',
  617.                   'EndGroup',
  618.                'EndProject'
  619.  
  620. app2 = TR_CREATEAPP('TRCA_Name Progressbar')
  621. IF app2 ~= '00000000'x THEN DO
  622.    progresswindow = TR_OPENPROJECT(app2,windowtags2)
  623.    IF progresswindow ~= '00000000'x THEN DO
  624.       CALL _Main()
  625.       CALL TR_CLOSEPROJECT(progresswindow)
  626.    END
  627.    IF app2 ~= '00000000'x THEN CALL TR_DELETEAPP(app2)
  628. END
  629.  
  630. RETURN 0
  631.  
  632. /* Dateiparameter ermitteln alles einsortieren */
  633.  
  634. _Main:
  635.  
  636. List.0   = 0
  637. PList.0  = 0
  638. NList.0  = 0
  639. i        = 1
  640.  
  641. IF GType = "SFS0" THEN DO
  642.   MaxLen = MaxLen - 1
  643.   Len2   = 3
  644.   Text2  = localestring(WIN_RightField_SFS)             /* 66 */
  645.   DO while List~=''
  646.      CALL TR_SETATTRIBUTE(progresswindow,7,'TRAT_Value',i)
  647.      parse var List fullname ':' List
  648.      parse var fullname filename '$' SlotNr
  649.      fileinfo=statef(SourceDelDir'/'fullname)
  650.      parse var fileinfo . size . protbits days minutes ticks
  651.      IF size > 0 THEN DO
  652.        Dopus GetFileType SourceDelDir"/"'"'fullname'"'
  653.        Type = RESULT
  654.        IF Length(Size) > 3 THEN
  655.          size = Left(Size,Length(Size)-3)||"."||Right(Size,3)
  656.        IF Length(Size) > 7 THEN
  657.          size = Left(Size,Length(Size)-7)||"."||Right(Size,7)
  658.        Size = Right(size,10)
  659.        Blanks = Copies(" ",MaxLen - Length(Filename))
  660.        Date = Translate(DATE('N',days),"."," ")
  661.        Std = Right(Trunc(Minutes/60),2,'0')
  662.        Min = Right(((Minutes/60-Std)*60),2,'0')
  663.        Sec = Right(Trunc(Ticks/50),2,'0')
  664.        List.i = FileName||Blanks||Size"  "date"  "Std":"Min":"Sec"  "Type
  665.        NList.i = SlotNr
  666.        FList.i = Filename
  667.        i = i + 1
  668.      END
  669.   END
  670. END
  671. ELSE DO
  672.   MaxLen = 21
  673.   Len2   = 17
  674.   Text2  = localestring(WIN_RightField_PFS)               /* 67 */
  675.   DO while List~=''
  676.      CALL TR_SETATTRIBUTE(progresswindow,7,'TRAT_Value',i)
  677.      parse var List fullname ':' List
  678.      parse var fullname filename '@' SlotNr
  679.      fileinfo=statef(SourceDelDir'/'fullname)
  680.      parse var fileinfo . size . protbits days minutes ticks
  681.      IF size > 0 THEN DO
  682.        Dopus GetFileType SourceDelDir"/"'"'fullname'"'
  683.        Type = RESULT
  684.        IF Length(Size) > 3 THEN
  685.          size = Left(Size,Length(Size)-3)||"."||Right(Size,3)
  686.        IF Length(Size) > 7 THEN
  687.          size = Left(Size,Length(Size)-7)||"."||Right(Size,7)
  688.        Size = Right(size,10)
  689.        Blanks = Copies(" ",MaxLen - Length(Filename) -4)
  690.        Date = Translate(DATE('N',days),"."," ")
  691.        Std = Right(Trunc(Minutes/60),2,'0')
  692.        Min = Right(((Minutes/60-Std)*60),2,'0')
  693.        Sec = Right(Trunc(Ticks/50),2,'0')
  694.        List.i = SlotNr"  "FileName||Blanks||Size"  "date"  "Std":"Min":"Sec"  "Type
  695.        NList.i = Filename
  696.        FList.i = Fullname
  697.        i = i + 1
  698.      END
  699.   END
  700. END
  701.  
  702. list.0  = i-1
  703. NList.0 = i-1
  704. FList.0 = i-1
  705.  
  706. RETURN 0
  707.  
  708.  
  709. /* ZielPfad festlegen */
  710.  
  711. _MakeDestPath:
  712.   Parse Arg DdirName
  713.   IF Upper(Right(Path,Length(DdirName)+1)) = Upper(DDirName)||"/" THEN Desti = "Ram:"
  714.   ELSE Desti = Path
  715. RETURN
  716.  
  717.  
  718. /* PrefsStart */
  719.  
  720. _PrefsStart:
  721.  PARSE ARG From
  722.     IF From = '' THEN From = 0
  723.     IF Exists(RddPrefs) THEN DO
  724.       IF from THEN DO
  725.         CALL TR_CLOSEPROJECT(ListView)
  726.         CALL TR_DELETEAPP(app)
  727.         address command 'rx 'RddPrefs' 1 'PrefsVersion
  728.         Call _LoadPrefs()
  729.         Call _Fenster1()
  730.       END
  731.       ELSE DO
  732.         address command 'rx 'RDDPrefs' 0 'Prefsversion
  733.         Call _LoadPrefs()
  734.       END
  735.     END
  736.     ELSE DO
  737.       VARI.0 = 1
  738.       VARI.1 = RDDPrefs
  739.       ReqTitle = localestring(ERROR_Title)
  740.       ReqText = "\nCouldn`t find\n%s\n\nI will use\nbuiltin defaults.\n"
  741.       Gadgets = "OK"
  742.       CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  743.     END
  744. RETURN
  745.  
  746.  
  747. /*     Prefs      */
  748.  
  749. _Prefs:
  750.   IF EXISTS(ENVPrefs) THEN DO
  751.     Vers = ""
  752.     CALL Open('PrefsFile',ENVPrefs,'R')
  753.     DO WHILE Upper(Vers) ~= Upper(PrefsVersion)
  754.       Vers = ReadLn('PrefsFile')
  755.       IF EOF('PrefsFile') THEN leave
  756.     END
  757.     CALL Close('PrefsFile')
  758.     IF vers = PrefsVersion THEN
  759.       CALL _LoadPrefs()
  760.     ELSE
  761.       Call _PrefsStart()
  762.   END
  763.   ELSE
  764.     IF EXISTS(RDDprefs) THEN
  765.       Call _PrefsStart()
  766.     ELSE DO
  767.       VARI.0 = 1
  768.       VARI.1 = RDDPrefs
  769.       ReqTitle = localestring(ERROR_Title)
  770.       ReqText = "\nCouldn`t find\n%s\n\nI will use\nbuiltin defaults.\n"
  771.       Gadgets = "Well"
  772.       CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  773.     END
  774. RETURN
  775.  
  776. /* DefaultPrefs */
  777.  
  778. _TakeDefaultPrefs:
  779.     MinWidth       = 56
  780.     MinLines       = 8
  781.     DelDirName.3   = ""
  782.     TempDir        = "Ram:T/"
  783.     SFSDeldirName  = SFSDelDirNamePath'SFSDelDirName'
  784.     DeviceInfo     = DeviceInfoPath'DeviceInfo'
  785. RETURN
  786.  
  787. /* LoadPrefs */
  788.  
  789. _LoadPrefs:
  790.     CALL Open('PrefsFile',ENVprefs,'R')
  791.       DO i = 1 TO PrefsLines
  792.         Prefs.i = ReadLn('PrefsFile')
  793.       END
  794.     CALL Close('PrefsFile')
  795.     MinWidth       = Prefs.1
  796.     MinLines       = Prefs.2
  797.     DelDirName.3   = Prefs.3
  798.     TempDir        = Prefs.4
  799.     SFSDeldirName  = Prefs.5'SFSDelDirName'
  800.     DeviceInfo     = Prefs.6'DeviceInfo'
  801. RETURN
  802.  
  803. /*    Guide    */
  804.  
  805. _Guide:
  806.   IF language = "deutsch" THEN RDDGuide = RDDgGuide
  807.   ELSE                         RDDGuide = RDDeGuide
  808.   IF Exists(RDDGuide) THEN
  809.     command wait "DoubleClick" RDDGuide
  810.   ELSE
  811.     CALL _EasyRequest(localestring(Msg_Problem_Title),"Couldn`t find\n"RddGuide,VARI,"OK")
  812. RETURN
  813.  
  814. /* Loadrexx() */
  815.  
  816. loadrexx:
  817.    PARSE ARG dir,file,store
  818.    IF dir ~= '' THEN DO
  819.       IF RIGHT(dir,1) = ':' THEN
  820.          file = dir||file
  821.       ELSE
  822.          file = dir||'/'||file
  823.    END
  824.    IF ~OPEN('rexxfile',file,'R') THEN
  825.       RETURN(0)
  826.    rexxtext = READCH('rexxfile',64000)
  827.    INTERPRET rexxtext
  828.    CALL CLOSE('rexxfile')
  829.    IF store ~= '' THEN
  830.       INTERPRET store '= rexxtext'
  831.    DROP rexxtext
  832. RETURN(1)
  833.  
  834. /* Localestring() */
  835.  
  836. localestring:
  837.    PARSE ARG stringnumber
  838.    IF catalog ~= 0 THEN
  839.       RETURN(GETCATALOGSTR(catalog,stringnumber,strings.stringnumber))
  840.    ELSE
  841.       RETURN(strings.stringnumber)
  842.  
  843.  
  844. /* Filerequester */
  845.  
  846. _FileRequest:
  847. Parse ARG DestiDir, File, Titel, Pattern, Art, Modus, Icons
  848.  
  849. IF Art = 0 THEN DO
  850. Auswahl = ASL_RequestFile(ListView,'SaveFile',,
  851.                       "ASLFR_DrawersOnly" Art,
  852.                       "ASLFR_DoSaveMode" Modus,
  853.                       "ASLFR_InitialPattern" Pattern,
  854.                       "ASLFR_DoPatterns" 1,
  855.                       "ASLFR_RejectIcons" Icons,
  856.                       "ASLFR_InitialDrawer" DestiDir,
  857.                       "ASLFR_InitialFile" '"'File'"',
  858.                       "ASLFR_TitleText" '"'Titel'"')
  859. END
  860. ELSE DO
  861. Auswahl = ASL_RequestFile(ListView,'SaveFile',,
  862.                       "ASLFR_DrawersOnly" Art,
  863.                       "ASLFR_InitialDrawer" DestiDir,
  864.                       "ASLFR_RejectPattern" Pattern,
  865.                       "ASLFR_TitleText" '"'Titel'"')
  866. END
  867.  
  868. RETURN
  869.  
  870. /* Missed Program */
  871.  
  872. _MissedProgram:
  873. PARSE ARG Program
  874.     VARI.0 = 1
  875.     VARI.1 = Program
  876.     ReqText = localestring(ERROR_Missed_Program) /* 4 */
  877.     Gadgets = localestring(Button_Prefs_Cancel)
  878.     CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  879.     IF Open('ReqErg',"Ram:T/RDDReqerg",'R') THEN DO
  880.       IF ReadCh('ReqErg') = 1 THEN DO
  881.         IF Exists(RddPrefs) THEN
  882.           address command 'rx 'RddPrefs' 0'PrefsVersion
  883.         ELSE
  884.           CALL _EasyRequest(localestring(Msg_Problem_Title),"Couldn`t find\n"RddPrefs,VARI,"OK")
  885.       END
  886.       CALL Close('ReqErg')
  887.     END
  888. RETURN
  889.  
  890. /* ---------- Routine zur Textausgabe mittels TR_EasyRequest() ------------ */
  891.  
  892. _EasyRequest:
  893.  
  894.   Parse Arg ReqTitle, ReqText, VARI, Gadgets
  895.  
  896.   DO WHILE POS('\n',ReqText) > 0
  897.     ReqText = Overlay(D2C(10),ReqText,Pos('\n',ReqText),2)
  898.   END
  899.   i = 0
  900.   IF VARI.0 > 0 & VARI.0 ~= 'VARI.0' THEN DO WHILE Pos('%s',ReqText) > 0
  901.     i = i + 1
  902.     ReqText = Insert(VARI.i,ReqText,Pos('%s',ReqText)+1)
  903.     ReqText = DelStr(ReqText,Pos('%s',ReqText),2)
  904.   END
  905.   IF VARI.0 ~= i THEN DO
  906.     Text = VARI.0" %s  sent by program"||NL||,
  907.                 i" %s  found in string"||NL||NL||,
  908.                 "Please contact the auhor"
  909.     CALL OPEN('Shell','CON:160/50/500/160/Problem/CLOSE/WAIT')
  910.     WriteLn('Shell','Stringsproblem:'||NL||NL||Text)
  911.     CALL CLOSE('Shell')
  912.   END
  913.   Meldung = TR_EasyRequest(app,,
  914.   ReqText,Gadgets,,
  915.   "TREZ_Title" '"'ReqTitle'"',
  916.   "TREZ_LockProject" WindowProject)
  917.   VARI.0 = 0
  918.   Gadgets = "OK"
  919. RETURN (Meldung)
  920.  
  921. /* ------------ Routine zur Textausgabe mittels RequestChoice -------------- */
  922.  
  923. _RequestChoice:
  924.  
  925. Parse Arg ReqTitle, ReqText, VARI, Gadgets
  926.  
  927. /*            Variablen einfügen             */
  928. i = 0
  929. IF VARI.0 > 0 & VARI.0 ~= 'VARI.0' THEN DO WHILE Pos('%s',ReqText) > 0
  930.   i = i + 1
  931.   ReqText = Insert(VARI.i,ReqText,Pos('%s',ReqText)+1)
  932.   ReqText = DelStr(ReqText,Pos('%s',ReqText),2)
  933. END
  934. IF VARI.0 ~= i THEN DO
  935.   Text = VARI.0" %s  sent by program"||NL||,
  936.               i" %s  found in string"||NL||NL||,
  937.               "Please contact the auhor"
  938.   CALL OPEN('Shell','CON:160/50/500/160/Problem/CLOSE/WAIT')
  939.   WriteLn('Shell','Stringsproblem:'||NL||NL||Text)
  940.   CALL CLOSE('Shell')
  941. END
  942.  
  943. RCText = ReqText
  944. /*   Catalog für Requestchoice aufbereiten   */
  945. IF Catalog ~= 0 THEN DO
  946.   DO i = 1 TO Length(RCText) +5
  947.     IF Substr(RCText,i,1) = NL THEN DO
  948.       RCText = Overlay('*',RCText,i)
  949.       RCText =  Insert('n',RCText,i)
  950.     END
  951.   END
  952. END
  953.  
  954. /*            Strings aufbereiten            */
  955. DO WHILE POS('\n',ReqText) > 0
  956.   ReqText = Overlay(D2C(10),ReqText,Pos('\n',ReqText),2)
  957.   RCText  = Overlay('*n',RCText,Pos('\n',RCText),2)
  958. END
  959.  
  960.  
  961. IF EXISTS('c:RequestChoice') THEN DO
  962.   Dosbefehl = "C:RequestChoice >Ram:T/RDDReqerg "||,
  963.                D2C(32)||D2C(34)||,
  964.                ReqTitle||,
  965.                D2C(34)||D2C(32)||D2C(34)||,             
  966.                RCText||,
  967.                D2C(34)||D2C(32)||D2C(34)||,
  968.                Gadgets||D2C(34)
  969.   ADDRESS COMMAND Dosbefehl
  970. END
  971. ELSE DO  /* Wer RequestChoice nicht hat, bekommt eben eine Shell */
  972.   IF OPEN('Shell','CON:160/50/500/160/'ReqTitle'/CLOSE/WAIT') THEN DO
  973.     WriteLn('Shell',ReqTitle||NL||NL||' 'ReqText)
  974.     CALL CLOSE('Shell')
  975.   END
  976. END
  977.  
  978. /* ReqTexte in Ram:RDD.Fehler speichern:             */
  979. IF ReqTitle == "Early RecoverDelDir Error" THEN DO
  980.   IF EXISTS("Ram:E-RDD.error") THEN
  981.     CALL OPEN('EText',"Ram:E-RDD.error",'A')
  982.   ELSE
  983.     CALL OPEN('EText',"Ram:E-RDD.error",'W')
  984.   WriteLn('EText',Script)
  985.   WriteLn('EText',GName' ('Device') Format: 'GType' Destination: 'Desti)
  986.   WriteLn('EText','Last Button Nr.: 'event.trm_id||D2C(10))
  987.   WriteLn('EText',ReqTitle||NL||NL||' 'ReqText||NL)
  988.   CALL CLOSE('EText')
  989.   lister set source_handle.0 busy 0
  990.   Setclip('RecoverDelDir',1)
  991.   EXIT(20)
  992. END
  993. ELSE DO
  994.   IF EXISTS(localestring(SCRIPTERROR_FileName)) THEN
  995.     CALL OPEN('ErrorText',localestring(SCRIPTERROR_FileName),'A')                          /* 78 */
  996.   ELSE
  997.     CALL OPEN('ErrorText',localestring(SCRIPTERROR_FileName),'W')
  998.   WriteLn('ErrorText',Copies("-",Length(SourceLine(1))))
  999.   WriteLn('ErrorText',SourceLine(1))
  1000.   WriteLn('ErrorText',Copies("-",Length(SourceLine(1)))||NL)
  1001.   WriteLn('ErrorText',Script)
  1002.   WriteLn('ErrorText','Device         : 'GName' ('Device')')
  1003.   WriteLn('ErrorText','Format         : 'GType)
  1004.   WriteLn('ErrorText','Source         : 'SourceDelDir)
  1005.   WriteLn('ErrorText','Destination    : 'Desti)
  1006.   WriteLn('ErrorText','Last Button Nr.: 'event.trm_id||NL)
  1007.   IF exists(EnvPrefs) THEN DO
  1008.     CALL Open('PrefsFile',ENVprefs,'R')
  1009.       DO i = 1 TO PrefsLines
  1010.         Prefs.i = ReadLn('PrefsFile')
  1011.         WriteLn('ErrorText','Prefs.'i' : 'Prefs.i)
  1012.       END
  1013.     CALL Close('PrefsFile')
  1014.   END
  1015.   ELSE
  1016.     WriteLn('ErrorText','Used intern prefs')
  1017.   WriteLn('ErrorText',NL||ReqTitle||NL||NL||ReqText||NL)
  1018.   CALL CLOSE('ErrorText')
  1019. END
  1020. Setclip('RecoverDelDir',1)
  1021. lister set source_handle.0 busy 0
  1022. RETURN
  1023.  
  1024. /* ----------------- Im Falle eines Script-Fehlers hier hin springen ---------------- */
  1025.  
  1026. break_c:           
  1027. failure:
  1028. halt:
  1029. ioerr:
  1030. syntax:
  1031.    Line = sigl
  1032.    ErrorSourceLine = ' '||Translate(Strip(SOURCELINE(Line),'B'),D2C(39),D2C(34))
  1033.    IF Length(ErrorSourceLine) > 40 THEN DO
  1034.      Len1 = Trunc(Length(ErrorSourceLine) / 2)
  1035.      Len2 = Length(ErrorSourceLine) - Len1
  1036.      ErrorSourceLine = Left(ErrorSourceLine,Len1)||"\n "||Right(ErrorSourceLine,Len2)
  1037.    END                                                                                   
  1038.    ReqTitle = localestring(SCRIPTERROR_Title)                                             /* 73 */
  1039.    ReqText  = localestring(SCRIPTERROR_Body_1)                                            /* 74 */
  1040.    Gadgets  = localestring(SCRIPTERROR_B0)                                                /* 77 */
  1041.    VARI.0 = 4
  1042.    VARI.1 = rc
  1043.    VARI.2 = ERRORTEXT(rc)
  1044.    VARI.3 = Line
  1045.    VARI.4 = ErrorSourceLine
  1046.    CALL _RequestChoice(ReqTitle,ReqText,VARI,Gadgets)
  1047.    lister set source_handle.0 busy 0
  1048.    IF app  ~= '00000000'x THEN CALL TR_DELETEAPP(app)
  1049.    IF app2 ~= '00000000'x THEN CALL TR_DELETEAPP(app2)
  1050.    Setclip('RecoverDelDir',1)
  1051.    IF catalog ~= 0 THEN CALL CLOSECATALOG(catalog)
  1052. EXIT(20)
  1053.